<template>
  <div>
    <el-button type="primary" size="small" @click="handleTest">测试</el-button>
  </div>
</template>
<script>
import { evaluate, format, parser } from '@/../lib/math.js';
// import math from '@/../lib/math.js';
// math.evaluate('')
export default {
  components: {},
  mixins: [],
  props: {},
  data() {
    return {};
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  methods: {
    /**
     * Helper函数在控制台中输出一个值。值将被格式化。
     * @param {*} value
     */
    print(value) {
      const precision = 14;
      console.log(format(value, precision));
    },
    handleTest() {
      //  作用域可以同时包含变量和函数
      const scope = {
        obj: {
          value: 42,
          name: 'obj对象',
          type: 3,
          prop: 55
        },
        a: 5,
        b: 6,
        funtest: function(x) {
          return x + '拼接的数据！';
        }
      };
      scope.titleFun = function(name) {
        return 'hello, ' + name + '!';
      };
      // 使用点符号或括号符号检索属性
      this.print(evaluate('obj.prop', scope)); // 42
      // this.print(evaluate('obj["prop"]', scope)); // 42
      // 可以从作用域读取变量
      this.print(evaluate('a * b', scope)); // 30
      // 将变量分配写入作用域
      this.print(evaluate('c = 2.3 + 4.5', scope)); // 6.8
      this.print(scope); // 6.8
      // 使用函数
      console.log('titleFun=', evaluate('titleFun(obj.name)', scope));
      // console.log('funtest=', evaluate(scope.funtest(scope.obj.name), scope));

      // 将函数定义为表达式
      const f = evaluate('f(x) = x>a', scope);
      console.log('x>a', evaluate(f(scope.b), scope));

      // 设置属性(返回整个对象，而不是属性值!)
      evaluate('obj.prop = 43', scope); // {prop: 43}
      // evaluate('obj["prop"] = 43', scope); // {prop: 43}
      this.print(scope);
      // 分号语句对输出是隐藏的
      this.print(evaluate('a=3; b=4; a*b ', scope)); // ResultSet, [7, 12]
      this.print(evaluate('a=3; b=4; (obj.type + b)*a ', scope)); // ResultSet, [21]
      // this.print(evaluate('max(2, 1, 5)'));
      // 一次计算多个表达式
      console.log('\n一次求值多个表达式');
      this.print(evaluate(['f = 3', 'g = 4', 'f * g'])); // [3, 4, 12]
    }
  }
};
</script>
<style lang="scss" scoped></style>
